﻿/*
*********************************************************************************************************
*
*	模块名称 : 安富莱LED-485-XXX系列数码管的驱动程序
*	文件名称 : bsp_rs485_led.c
*	版    本 : V1.0
*	说    明 : 驱动安富莱电子生产的RS485 LED数码管显示屏。 使用了 bsp_modbus.c 文件。
*			  型号: LED-485-043	 三位0.4寸数码管
*				    LED-485-034  四位0.3寸数码管
*				    LED-485-083  三位0.8寸数码管
*				    LED-485-054  四位0.56寸数码管
*
*			  支持ASCII协议 和 Modbus RTU协议。可以通过485指令进行切换。
*
*	Copyright (C), 2014-2015, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/

#include "bsp.h"

/*
*********************************************************************************************************
*	函 数 名: LED485_TestOk
*	功能说明: 测试数码管应答. 数码管会应答OK。 需要先切换到ASCII协议。
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_TestOk(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,01&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ReadModel
*	功能说明: 读取数码管型号. 需要先切换到ASCII协议。 改命令只是发送指令，主程序根据 MSG_485_RX 消息获得
*			  结果
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_ReadModel(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,02&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ReadVersion
*	功能说明: 读取数码管固件版本. 需要先切换到ASCII协议。 本函数只是发送指令，主程序根据 MSG_485_RX 消息获得
*			  结果
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_ReadVersion(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,03&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ReadBright
*	功能说明: 读取数码管亮度参数。需要先切换到ASCII协议。 本函数只是发送指令，主程序根据 MSG_485_RX 消息获得
*			  结果
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_ReadBright(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,04&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_SetBrightA
*	功能说明: 设置LED数码管的亮度 （采用ASCII协议)
*	形    参: _addr : 从机的485地址
*			  _bright : 亮度值 0 - 7
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_SetBrightA(uint8_t _addr, uint8_t _bright)
{
	char buf[10];

	sprintf(buf, "$%03d,%d%%", _addr, _bright);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ModifyAddrA
*	功能说明: 修改LED数码管的地址. （采用ASCII协议)
*	形    参: _addr : 从机的485地址
*			  _NewAddr : 新地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_ModifyAddrA(uint8_t _addr, uint8_t _NewAddr)
{
	char buf[10];

	sprintf(buf, "$%03d,%03d@", _addr, _NewAddr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_DispNumberA
*	功能说明: 显示1个整数.  使用ASCII协议。
*	形    参: _addr : 从机的485地址
*			  _iNumber : 整数，负数用补码表示
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_DispNumberA(uint8_t _addr, int16_t _iNumber)
{
	char buf[16];

	sprintf(buf, "$%03d,%3d#", _addr, _iNumber);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_DispStrA
*	功能说明: 显示1个ASCII字符串； 使用ASCII协议。
*	形    参: _addr : 从机的485地址
*			  _iNumber : 整数，负数用补码表示
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_DispStrA(uint8_t _addr, char *_str)
{
	char buf[16];

	sprintf(buf, "$%03d,%s#", _addr, _str);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_SetProtRTU
*	功能说明: 设置从机的通信协议为 Modbus RTU
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_SetProtRTU(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,81&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_SetProtAscii
*	功能说明: 设置从机的通信协议为 ASCII
*	形    参: _addr : 从机的485地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_SetProtAscii(uint8_t _addr)
{
	char buf[10];

	sprintf(buf, "$%03d,80&", _addr);
	RS485_SendStr(buf);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_DispNumber
*	功能说明: 显示1个整数
*	形    参: _addr : 从机的485地址
*			  _iNumber : 整数，负数用补码表示
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_DispNumber(uint8_t _addr, int16_t _iNumber)
{
	uint8_t txbuf[6];

	txbuf[0] = _addr;			/* 485地址 */
	txbuf[1] = 0x06;			/* 功能码 */
	txbuf[2] = 0x00;			/* 寄存器 ：00 88 */
	txbuf[3] = 0x88;
	txbuf[4] = _iNumber >> 8;	/* 要显示的整数 */
	txbuf[5] = _iNumber;

	MODBUS_SendWithCRC(txbuf, 6);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_SetDispDot
*	功能说明: 设置小数点位数
*	形    参: _addr : 从机的485地址
*			  _dot : 小数点位数。数码管上电后缺省是0，表示无小数点。
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_SetDispDot(uint8_t _addr, uint8_t _dot)
{
	uint8_t txbuf[6];

	txbuf[0] = _addr;			/* 485地址 */
	txbuf[1] = 0x06;			/* 功能码 */
	txbuf[2] = 0x00;			/* 寄存器 ：00 25 */
	txbuf[3] = 0x25;
	txbuf[4] = 0x00;			/* 00 00 表示无小数点， 00 02 表示2位小数点 */
	txbuf[5] = _dot;

	MODBUS_SendWithCRC(txbuf, 6);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_SetBright
*	功能说明: 设置LED数码管的亮度
*	形    参: _addr : 从机的485地址
*			  _bright : 亮度值 0 - 7
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_SetBright(uint8_t _addr, uint8_t _bright)
{
	uint8_t txbuf[6];

	txbuf[0] = _addr;			/* 485地址 */
	txbuf[1] = 0x06;			/* 功能码 */
	txbuf[2] = 0x00;			/* 亮度寄存器 ：00 24 */
	txbuf[3] = 0x24;
	txbuf[4] = 0x00;			/* 00 00 表示无小数点， 00 02 表示2位小数点 */
	txbuf[5] = _bright;

	MODBUS_SendWithCRC(txbuf, 6);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ModifyAddr
*	功能说明: 修改LED数码管的地址
*	形    参: _addr : 从机的485地址
*			  _NewAddr : 新地址
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_ModifyAddr(uint8_t _addr, uint8_t _NewAddr)
{
	uint8_t txbuf[6];

	txbuf[0] = _addr;			/* 485地址 */
	txbuf[1] = 0x06;			/* 功能码 */
	txbuf[2] = 0x00;			/* 地址寄存器 ：00 23 */
	txbuf[3] = 0x23;
	txbuf[4] = 0x00;
	txbuf[5] = _NewAddr;

	MODBUS_SendWithCRC(txbuf, 6);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_ModifyAddr
*	功能说明: 修改LED数码管的地址
*	形    参: _addr : 从机的485地址
*			  _iNumber : 要显示的整数
*			  _dot : 小数点位数
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_DispNumberWithDot(uint8_t _addr, int16_t _iNumber, uint8_t _dot)
{
/*
	PLC发送  :0110 00 90 00 02 04 00 0201 EA DB 1C
	?  01:   数码管屏的站号（RS485地址）
	?  10 :   功能码，表示写多个寄存器
	?  00 90 :   数码管屏的显示寄存器(带小数点和正负号的整数)
	?  00 02:  寄存器个数
	?  04:  数据个数（字节数）
	?  00 02：  00 表示正负号（00=正数；01=负数，数字前显示-）
				02 表示小数点位数，0表示无小数点。2表示小数点后有2位数字
	?  01 EA:   2位整数，高字节在前。01 EA表示十进制 490
	?  DB 1C  :   二个字节CRC码
	此命令将显示“4.90”
	数码管屏返回 ：01 10 00 90 00 02 41 E5
*/
	uint8_t txbuf[11];

	txbuf[0] = _addr;			/* 485地址 */
	txbuf[1] = 0x10;			/* 功能码 10*/

	txbuf[2] = 0x00;			/* 地址寄存器 ：00 90 */
	txbuf[3] = 0x90;

	txbuf[4] = 0x00;			/* 寄存器个数 */
	txbuf[5] = 0x02;

	txbuf[6] = 0x04;			/* 数据个数 */

	if (_iNumber < 0)			/* 显示正负号 */
	{
		txbuf[7] = 0x01;
	}
	else
	{
		txbuf[7] = 0x00;
	}

	txbuf[8] = _dot;			/* 小数点个数 */

	if (_iNumber < 0)
	{
		_iNumber = -_iNumber;
	}
	txbuf[9] = _iNumber >> 8;
	txbuf[10] = _iNumber;

	MODBUS_SendWithCRC(txbuf, 11);
}

/*
*********************************************************************************************************
*	函 数 名: LED485_DispStr
*	功能说明: 显示字符串
*	形    参: _addr : 从机的485地址
*			  _iNumber : 要显示的整数
*			  _dot : 小数点位数
*	返 回 值: 无
*********************************************************************************************************
*/
void LED485_DispStr(uint8_t _addr, char *_str)
{
/*
	PLC发送  :
	0110 00 70 00 06 0C 50 32 2E 33 00 00 00 00 00 00 00 00 3B 25
	?  01:   数码管屏的站号（RS485地址）
	?  10 :   功能码，表示写多个寄存器
	?  0070 :   数码管屏的显示寄存器(ASCII)
	?  00 06:  寄存器个数
	?  0C:   数据段的字节数
	?  50 32 2E 33 00 00 00 00 00 00 00 00  :
	ASCII字符串。固定长度12字节，长度不足12位的字符串右边必须填00。本例
	表示ASCII字符串”P2.3”
	?  3B 25  :   二个字节CRC码
	此命令将显示“P2.3”
	数码管屏返回 ：01 10 00 70 00 06 41 D0
*/
	uint8_t txbuf[20];
	uint8_t i;
	uint8_t pos = 0;
	uint8_t zero = 0;

	txbuf[pos++] = _addr;			/* 485地址 */
	txbuf[pos++] = 0x10;			/* 功能码 10*/

	txbuf[pos++] = 0x00;			/* 地址寄存器 ：00 70 */
	txbuf[pos++] = 0x70;

	txbuf[pos++] = 0x00;			/* 寄存器个数 */
	txbuf[pos++] = 0x06;

	txbuf[pos++] = 0x0C;			/* 数据个数 */

	for (i = 0; i < 12; i++)
	{
		if (zero == 0)
		{
			if (_str[i] == 0)
			{
				zero = 1;
			}
			txbuf[pos++] = _str[i];
		}
		else
		{
			txbuf[pos++] = 0;
		}
	}
	MODBUS_SendWithCRC(txbuf, pos);
}

/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
